Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling

Over Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling


Publicatiedatum:
01-05-2026

Inwerkingtreding:
01-05-2026

1.1 Wat is het gemiddeld aantal personeelsleden?

Concepten

Relaties

Eigenschappen

SPARQL query

Code gekopieerd

...

Kopieer naar klembord

1# Indicator: Zorgkantoren 1.1
2# Parameters: ?jaar, ?kwartaal, ?zorgkantoor
3# Ontologie: versie 3.0.0 of nieuwer
4
5PREFIX onz-g:   <http://purl.org/ozo/onz-g#>
6PREFIX onz-pers:<http://purl.org/ozo/onz-pers#>
7PREFIX onz-org: <http://purl.org/ozo/onz-org#>
8PREFIX rdfs:    <http://www.w3.org/2000/01/rdf-schema#>
9PREFIX xsd:     <http://www.w3.org/2001/XMLSchema#>
10PREFIX time:    <http://www.w3.org/2006/time#>
11
12SELECT
13  (?vestiging AS ?Indeling)
14  (SUM(IF(?dagen_periode <= 0, 0, IF(?zorg_aandeel       / ?dagen_periode > 1, 1, ?zorg_aandeel       / ?dagen_periode))) AS ?Zorg)
15  (SUM(IF(?dagen_periode <= 0, 0, IF(?niet_zorg_aandeel  / ?dagen_periode > 1, 1, ?niet_zorg_aandeel  / ?dagen_periode))) AS ?Niet_zorg)
16  (SUM(IF(?dagen_periode <= 0, 0, IF((?zorg_aandeel + ?niet_zorg_aandeel) / ?dagen_periode > 1, 1, (?zorg_aandeel + ?niet_zorg_aandeel) / ?dagen_periode))) AS ?Totaal)
17WHERE {
18  SELECT
19    ?vestiging
20    ?zorgkantoor_vestiging
21    ?persoon
22    ?dagen_periode
23    (SUM(?zorg_dagen_uniek)      AS ?zorg_aandeel)
24    (SUM(?niet_zorg_dagen_uniek) AS ?niet_zorg_aandeel)
25  WHERE {
26    {
27      SELECT
28        ?vestiging
29        ?zorgkantoor_vestiging
30        ?persoon
31        ?dagen_periode
32        (COUNT(DISTINCT ?dag_num_zorg)     AS ?zorg_dagen_uniek)
33        (COUNT(DISTINCT ?dag_num_nietzorg) AS ?niet_zorg_dagen_uniek)
34      WHERE {
35        #BIND(2024 AS ?jaar)
36        #BIND("Q1" AS ?kwartaal)
37        
38        # Gedeeld patroon :  Overeenkomsten die (deels) binnen deze periode vallen en berekening aantal dagen binnen deze periode
39        BIND(
40          IF(?kwartaal = 'Q1', xsd:date(CONCAT(STR(?jaar), '-01-01')),
41          IF(?kwartaal = 'Q2', xsd:date(CONCAT(STR(?jaar), '-04-01')),
42          IF(?kwartaal = 'Q3', xsd:date(CONCAT(STR(?jaar), '-07-01')),
43          IF(?kwartaal = 'Q4', xsd:date(CONCAT(STR(?jaar), '-10-01')),
44          '')))) AS ?start_periode
45        )
46        BIND(?start_periode + "P3M"^^xsd:duration + "-P1D"^^xsd:duration AS ?eind_periode)
47
48        # Maak van de datums een numerieke waarden zodat we later met unieke dagnummers kunnen rekenen
49        ?start_periode ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?start_periode_numeriek .
50        ?eind_periode  ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?eind_periode_numeriek .
51        BIND(?eind_periode_numeriek - ?start_periode_numeriek + 1 AS ?dagen_periode)
52
53        VALUES ?personeels_overeenkomst {
54          onz-pers:ArbeidsOvereenkomst
55          onz-pers:UitzendOvereenkomst
56          onz-pers:InhuurOvereenkomst
57        }
58
59        ?overeenkomst a ?personeels_overeenkomst ;
60          onz-pers:heeftOpdrachtnemer ?persoon ;
61          onz-g:startDatum ?overeenkomst_start ;
62          onz-g:hasPart ?overeenkomst_afspraak .
63        OPTIONAL { ?overeenkomst onz-g:eindDatum ?overeenkomst_eind }
64
65        ?overeenkomst_afspraak a onz-pers:WerkOvereenkomstAfspraak ;
66          onz-g:startDatum ?start_afspraak ;
67          onz-g:isAbout ?functie.
68        OPTIONAL { ?overeenkomst_afspraak onz-g:eindDatum ?eind_afspraak }
69        FILTER( ?overeenkomst_start <= ?eind_periode &&
70          ( ?overeenkomst_eind >= ?start_periode || !BOUND(?overeenkomst_eind) ) )
71        
72        ?functie a onz-g:OccupationalPositionRole .
73        BIND( IF(EXISTS { ?functie a onz-pers:ZorgverlenerFunctie }, 1, 0) AS ?zorg_boolean )
74        
75        # De correcte start en einddatum van de overeenkomst. Indien buiten periode dan start en eind periode
76        BIND( IF(?overeenkomst_start <  ?start_periode, ?start_periode, ?overeenkomst_start) AS ?start_ovk_corr )
77        BIND( IF(!BOUND(?overeenkomst_eind) || ?overeenkomst_eind > ?eind_periode, ?eind_periode, ?overeenkomst_eind) AS ?eind_ovk_corr )
78
79        # De correcte start en einddatum van de afspraak. Fallback zijn de waarden van de overeenkomst zoals hierboven berekend. Dit is de waarde waarmee wordt gerekend.
80        BIND( IF(?start_afspraak > ?start_ovk_corr, ?start_afspraak, ?start_ovk_corr) AS ?start_afspraak_corr )
81        BIND( IF(BOUND(?eind_afspraak) && ?eind_afspraak < ?eind_ovk_corr, ?eind_afspraak, ?eind_ovk_corr) AS ?eind_afspraak_corr )
82        FILTER(?start_afspraak_corr <= ?eind_afspraak_corr)
83
84        {
85          # Per vestiging: deze tak koppelt de medewerkers aan een vestiging via de locatie van de werkovereenkomst afspraak
86          ?overeenkomst_afspraak onz-g:isAbout ?locatie.
87          ?locatie a onz-g:StationaryArtifact ;
88            onz-g:partOf* ?vestiging_uri .
89          ?vestiging_uri a onz-org:Vestiging ;
90            onz-g:hasLocalizableArea/onz-g:identifiedBy/onz-g:hasPart/onz-g:hasPart ?postcode_6 ;
91            onz-g:identifiedBy ?vest_nr .
92          ?vest_nr a onz-org:Vestigingsnummer 
93            ; onz-g:hasDataValue ?vestiging .
94
95          BIND(IRI(SUBSTR(STR(?postcode_6), 1, STRLEN(STR(?postcode_6)) - 2)) AS ?postcode)
96          ?pc_gebied onz-g:identifiedBy ?postcode ; onz-g:partOf+ ?zk_regio .
97          ?zk_regio a onz-org:ZorgkantoorRegio .
98          ?zorgkantoor onz-g:hasOperatingRange ?zk_regio .
99        }
100        UNION
101        {
102          # Totaal organisatie: deze tak maakt voor alle medewerkers uit gedeelde patroon (incl medewerkers die geen locatie op de werkovereenkomstafspraak hebben) een totaal organisatie regel aan
103          BIND("Organisatie (gecontracteerd + algemeen)" AS ?vestiging)
104        }
105
106
107        # Kalender: alle dagen in dit kwartaal numeriek maken (offset 0..99, gefilterd tot eind) 
108        VALUES ?tiendetal {0 1 2 3 4 5 6 7 8 9}
109        VALUES ?eental   {0 1 2 3 4 5 6 7 8 9}
110        BIND((?tiendetal*10 + ?eental) AS ?offset)
111        BIND(?start_periode_numeriek + ?offset AS ?dag_num)
112        FILTER(?dag_num <= ?eind_periode_numeriek)
113
114        # Hier worden de gecorrigeerde start en einddatum ook numeriek gemaakt 
115        ?start_afspraak_corr ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?start_num .
116        ?eind_afspraak_corr  ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?end_num .
117        FILTER(?start_num <= ?dag_num && ?dag_num <= ?end_num)
118
119        # DISTINCT in de COUNT voorkomt dubbeltelling bij overlap op dezelfde dag
120        BIND(IF(?zorg_boolean = 1, ?dag_num, ?unbound) AS ?dag_num_zorg)
121        BIND(IF(?zorg_boolean = 0, ?dag_num, ?unbound) AS ?dag_num_nietzorg)
122      }
123      GROUP BY ?vestiging ?zorgkantoor_vestiging ?persoon ?dagen_periode
124    }
125  }
126  GROUP BY ?vestiging ?zorgkantoor_vestiging ?persoon ?dagen_periode
127}
128GROUP BY ?vestiging ?zorgkantoor_vestiging
129ORDER BY ?vestiging